
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.border.TitledBorder;
import java.sql.*;
import java.util.ArrayList;

public class SelectionCategorie extends JFrame implements ActionListener {

  private JPanel pRes;
  private JPanel pOutil;
  private JTable tRes;
  private JRadioButton rASC;
  private JRadioButton rDESC;
  private JButton bRech;
  private JButton bMod;
  private JButton bSup;
  private JButton bQuit;
  private JScrollPane scroll;
  private Container contenu;
  private ButtonGroup bg;

  public SelectionCategorie() {
    super("Recherche de catégorie");
    this.setLayout(null);

    this.pRes = new JPanel(null, false);
    this.pRes.setBorder(new TitledBorder(null, "Resultat", TitledBorder.LEFT, TitledBorder.DEFAULT_POSITION));

    this.pOutil = new JPanel(null, false);
    this.pOutil.setBorder(new TitledBorder(null, "Outil", TitledBorder.LEFT, TitledBorder.DEFAULT_POSITION));

    this.loadTableauCat(true);

    this.bg = new ButtonGroup();
    this.rASC = new JRadioButton("Croissant", true);
    this.rDESC = new JRadioButton("Decroissant");
    this.bg.add(this.rASC);
    this.bg.add(this.rDESC);

    this.bRech = new JButton("Recherche");
    this.bRech.addActionListener(this);

    this.bMod = new JButton("Modifier");
    this.bMod.addActionListener(this);

    this.bSup = new JButton("Supprimer");
    this.bSup.addActionListener(this);

    this.bQuit = new JButton("Quitter");
    this.bQuit.addActionListener(this);

    this.contenu = this.getContentPane();
    this.contenu.setLayout(null);

    this.pRes.add(scroll);
    this.pOutil.add(this.bMod);
    this.pOutil.add(this.bQuit);
    this.pOutil.add(this.bSup);
    this.contenu.add(this.pRes);
    this.contenu.add(this.pOutil);

    this.pRes.setBounds(10, 20, 450, 300);
    this.pOutil.setBounds(475, 20, 150, 300);
    this.scroll.setBounds(10, 30, 430, 200);
    this.rASC.setBounds(120, 60, 100, 20);
    this.rDESC.setBounds(220, 60, 100, 20);
    this.bRech.setBounds(90, 120, 105, 20);
    this.bMod.setBounds(25, 30, 100, 20);
    this.bSup.setBounds(25, 80, 100, 20);
    this.bQuit.setBounds(25, 130, 100, 20);

    this.setBounds(50, 50, 650, 600);
    this.setVisible(true);

  }

  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == this.bRech);
    //TODO faire la recherche
    if (e.getSource() == this.bMod) {
      int selection = this.tRes.getSelectedRow();
      if (selection >= 0) {
        if (this.tRes.getSelectedRowCount() == 1) {
          GererCategorie gc = new GererCategorie(this.getSelectedCategorie(selection));
          this.loadTableauCat(false);
        } else {
          JOptionPane.showMessageDialog(this, "Vous ne pouvez sélectionner qu'une seule catégorie.", "Modifier la catégorie", JOptionPane.ERROR_MESSAGE);
        }
      } else {
        JOptionPane.showMessageDialog(this, "Vous devez sélectionner une catégorie.", "Modifier la catégorie", JOptionPane.ERROR_MESSAGE);
      }
    }
    if (e.getSource() == this.bQuit) {
      this.dispose();
    }
    if (e.getSource() == this.bSup) {
      int selection = this.tRes.getSelectedRow();
      if (selection >= 0) {
        if (this.tRes.getSelectedRowCount() == 1) {
          int confirm = JOptionPane.showConfirmDialog(this, "Êtes-vous sûr de vouloir supprimer cette catégorie ?", "Supprimer la catégorie", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
          if (confirm == JOptionPane.OK_OPTION) {
            try {
              getSelectedCategorie(selection).delete();
              JOptionPane.showMessageDialog(this, "La catégorie a bien été supprimée.", "Supprimer la catégorie", JOptionPane.INFORMATION_MESSAGE);
              this.loadTableauCat(false);
            } catch (Exception ex) {
              JOptionPane.showMessageDialog(this, "La suppression n'a pas pu aboutir.", "Supprimer la catégorie", JOptionPane.ERROR_MESSAGE);
            }
          }
        } else {
          JOptionPane.showMessageDialog(this, "Vous ne pouvez sélectionner qu'une seule catégorie.", "Supprimer la catégorie", JOptionPane.ERROR_MESSAGE);
        }
      } else {
        JOptionPane.showMessageDialog(this, "Vous devez sélectionner une catégorie.", "Supprimer la catégorie", JOptionPane.ERROR_MESSAGE);
      }
    }
  }

  public Categorie getSelectedCategorie(int selection) {
    return new Categorie(Integer.parseInt((String) this.tRes.getValueAt(selection, 0)), (String) this.tRes.getValueAt(selection, 1));
  }

  public void loadTableauCat(boolean callFromConstructor) {
    String[] colonnes = new String[]{"ID", "Catégorie"};

    ArrayList<Categorie> cats = null;
    try {
      cats = Categorie.chargerCategories();
    } catch (SQLException e) {
      JOptionPane.showMessageDialog(this, "Erreur dans le chargement des catégories \n" + e, "Erreur BDD", JOptionPane.ERROR_MESSAGE);
    }

    Object[][] catTab = new String[cats.size()][3];
    int i = 0;
    for (Categorie c : cats) {
      catTab[i] = new String[]{String.valueOf(c.getId()), c.getNom()};
      i++;
    }

    // On met à jour le tableau en enlevant l'ancien et en le reconstruisant

    if (!callFromConstructor) {
      this.pRes.remove(this.scroll);
    }

    this.tRes = new JTable(catTab, colonnes);
    this.scroll = new JScrollPane(this.tRes);
    this.scroll.createVerticalScrollBar();

    this.pRes.add(this.scroll);

    this.scroll.setBounds(10, 30, 430, 200);
  }
}
